# 5 ActiveRecord

ActiveRecord 一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于 ActiveRecord 往往只能感叹其优雅,所以我们也在 AR 道路上进行了一定的探索,喜欢大家能够喜欢,也同时欢迎大家反馈意见与建议。

# 如何配置❓

  • 需要继承 Model 类且实现主键指定方法
  • Mapper.java 也必须有
@Data
@Accessors(chain = true)// 如果为true,则设置器将返回此值而不是void。
public class User extends Model<User> {
  private Long id;
  private String name;
  private Integer age;
  private String email;

  @Override
  protected Serializable pkVal() {
    /**
     * AR 模式这个必须有,否则 xxById 的方法都将失效!
     * 另外 UserMapper 也必须 AR 依赖该层注入,有可无 XML
     */
    return id;
  }
}
// 这个得有,就算不去用它否则默认不注入
public interface UserMapper extends BaseMapper<User> {

}

# CRUD

image-20191215163919259

# insert

/**
 * 插入(字段选择插入)
 */
@Test
public void insert(){
  User user = new User();
  user.setUserName("zhangsan");
  user.setAge(888);
  user.setEmail("888@qq.com");
  boolean b = user.insert();
  
  Long id = user.getId();
}

# insertOrUpdate

/**
 * 插入 OR 更新,取决于是否有 ID
 */
@Test
public void insertOrUpdate(){
  User user = new User();
  user.setId(1205798000123752453L);
  user.setUserName("zhangsanfeng");
  user.setAge(88888);
  user.setEmail("88888@qq.com");
  boolean b = user.insertOrUpdate();

  Long id = user.getId();
}

# deleteById

/**
 * 根据主键或 ID 删除
 */
@Test
public void deleteById(){
  // 方式1
  // 如下写法需要 @Accessors(chain = true)
  boolean b1 = new User().setId(1205785512854446082L).deleteById();
  
  // 方式2
  // 如下写法需要 @Accessors(chain = true)
  boolean b2 = new User().deleteById(1205798000123752453L);
}

# delete

/**
 * 删除记录
 *
 * @param queryWrapper 实体对象封装操作类(可以为 null)
 */
@Test
public void delete(){
  boolean b = new User().delete(new LambdaQueryWrapper<User>()
                                .eq(User::getUserName, "zhangsan"));
}

# updateById

/**
 * 更新(字段选择更新)
 */
@Test
public void updateById(){
  // 如下写法需要 @Accessors(chain = true)
  boolean b = new User().setAge(888).setId(4L).updateById();
}

# update

/**
 * 执行 SQL 更新
 *
 * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
 */
@Test
public void update(){
  boolean b = new User().update(new LambdaUpdateWrapper<User>()
                                .set(User::getAge, 9999)
                                .set(User::getEmail, "9999@qq.com")
                                .ge(User::getId, 3L));
}

# selectById

/**
 * 根据 ID 查询
 *
 * @param id 主键ID
 */
@Test
public void selectById() {
  User user1 = new User().setId(4L).selectById();

  User user2 = new User().selectById(4L);
}

# selectOne

/**
 * 查询一条记录
 *
 * @param queryWrapper 实体对象封装操作类(可以为 null)
 */
@Test
public void selectOne() {
  User user = new User().selectOne(new LambdaQueryWrapper<User>()
                                   .eq(User::getId, 4L));
}

# selectCount

/**
 * 查询总数
 *
 * @param queryWrapper 实体对象封装操作类(可以为 null)
 */
@Test
public void selectCount() {
  Integer count = new User().selectCount(new LambdaQueryWrapper<User>()
                                         .eq(User::getId, 4L));
}

# selectList

/**
 * 查询总记录数
 *
 * @param queryWrapper 实体对象封装操作类(可以为 null)
 */
@Test
public void selectList() {
  List<User> list = new User().selectList(new LambdaQueryWrapper<User>()
                                          .ge(User::getAge, 18L));
}

# selectAll

/**
 * 查询所有
 */
@Test
public void selectAll(){
  List<User> list = new User().selectAll();
}

# selectPage

/**
 * 翻页查询
 *
 * @param page         翻页查询条件
 * @param queryWrapper 实体对象封装操作类(可以为 null)
 */
@Test
public void selectPage() {
  Page<User> userPage = new User().selectPage(new Page<>(1,2), new LambdaQueryWrapper<User>()
                                              .eq(User::getId, 4L));
  System.out.println(userPage);
}